package cn.wen.javax.net.mail.base;

import org.apache.commons.mail.HtmlEmail;

import cn.wen.javax.crypto.Decryptable;

/**
 * Title：邮件发送器工厂。
 * <p>
 * Description：根据提供的邮件服务器信息创建发送器。
 * <p>
 * Copyright：Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision：1.0 Date：2012/8/2 Description：初完成。
 *          <p>
 */
public class SimpleMailFactory {

    /**
     * 域名。
     */
    private String domainName;
    
    /**
     * 主机名。
     */
    private String hostName;
    
    /**
     * 是否启用http安全连接。
     */
    private boolean ssl;
    
    /**
     * 服务端口。
     */
    private int port;
    
    /**
     * 用户名。
     */
    private String userName;
    
    /**
     * 密码。
     */
    private String password;
    private String internalPassword;

    /**
     * 解密器
     */
    private Decryptable decryptor;

    public HtmlEmail getInstance() throws Exception {
	if (null == internalPassword) { // 初始内部密码。
	    if (null == decryptor) {
		internalPassword = password;
	    }
	    else { // 解密，获取明文密码。
		internalPassword = decryptor.decrypt(password);
	    }
	}
	HtmlEmail mail = null;
	if (null == hostName) {
	    mail = MailFactory.getSender(domainName, userName, internalPassword);
	}
	else {
	    mail = MailFactory.getSender(hostName, domainName, userName, internalPassword);
	}
	mail.setSSL(ssl);
	mail.setSmtpPort(getPort());
	return mail;
    }

    public String getDomainName() {
	return domainName;
    }

    public void setDomainName(String domainName) {
	this.domainName = domainName;
    }

    public String getHostName() {
	return hostName;
    }

    public void setHostName(String hostName) {
	this.hostName = hostName;
    }

    public boolean isSsl() {
	return ssl;
    }

    public void setSsl(boolean ssl) {
	this.ssl = ssl;
    }

    public int getPort() {
	if (0 == port) port = ssl ? 465 : 25;
	return port;
    }

    public void setPort(int port) {
	this.port = port;
    }

    public String getUserName() {
	return userName;
    }

    public void setUserName(String userName) {
	this.userName = userName;
    }

    public String getPassword() {
	return password;
    }

    public void setPassword(String password) {
	this.password = password;
    }

    public void setDecryptor(Decryptable decryptor) {
        this.decryptor = decryptor;
    }

}
